home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
8bit
/
cislib_b
/
relgen2.act
< prev
next >
Wrap
Text File
|
1995-04-22
|
6KB
|
313 lines
MODULE ;RELGEN.ACT
;COPYRIGHT 1984, QMI, JS DeMar
;REV. 1.1, March 20, 1984
;OBJECT CODE RELOCATION GENERATOR for
;ACTION! compiled binary-load files.
;WARNING!!! This program requires
;four OPEN files simultaneously.
;Be sure that DOS is configured for
;this. With DOS 2.0, set $709 equal
;to at least 4, rewrite DOS and
;reboot.
;Requires the second file compiled
;at any even page increment higher
;than the first file, for example:
;$3000 and $3100.
;Generates a table of the locations
;that require relocating and saves
;it in a ".GEN" file in ACTION!.
; The ".REL" file is the original
;object code with an origin of "0".
;The actual relocator is compiled
;from the generic relocator source
;called "RELOC.ACT" merged with the
;".GEN" file generated here. Append
;".REL" file to that code and it
;will load and relocate to MEMLO.
DEFINE in1="1",
in2="2",
out1="3",
out2="4"
BYTE abrt
;---------------------------------
PROC MyError(BYTE a,x,y)
IF y=170 THEN
PrintE("ERROR File not found!")
ELSE
Print("ERROR! ")
PrintBE(y)
FI
abrt=1
RETURN
;---------------------------------
PROC Ferror()
BYTE t,clock=$14
PrintE("ERROR in Output filespec!")
t=clock-$80
DO
UNTIL t=clock
OD
RETURN
;---------------------------------
PROC Main()
CARD start1,start2,end1,end2
CARD offsets,offsete,i,count,hits
CARD test1,test2,old1,old2,old3,old0
BYTE x,z,j,wnum,d1,d2,
sthigh
BYTE ARRAY fname1(18),fname2(18),
fnameout1(18),fnameout2(18)
DO
Put(125)
PrintE(" Relocation Code Generator ")
PrintE(" JS DeMar 3/84 ")
PutE()
PrintE(" Requires two code files compiled")
PrintE(" with an offset of $0100.")
PutE()
Print("Filespec for code A >")
InputMD(device,fname1,18)
PutE()
Print("Filespec for code B >")
InputMD(device,fname2,18)
PutE()
Scopy(fnameout1,fname1)
SCopy(fnameout2,fnameout1)
j=1
IF fnameout1(1)#'D
OR fnameout1(0)<4 THEN
Ferror()
ELSEIF fnameout1(2)=': THEN
z=0
ELSEIF fnameout1(3)=': THEN
z=1
FI
DO
x=fnameout1(j)
j==+1
IF x=$20 THEN
EXIT
ELSEIF x='. THEN
EXIT
ELSEIF j>fnameout1(0) THEN
j==+1
EXIT
ELSEIF j>11+z THEN
Ferror()
FI
OD
fnameout1(j-1)='.
fnameout1(j)='G
fnameout1(j+1)='E
fnameout1(j+2)='N
fnameout1(0)=j+2
j=1
IF fnameout2(1)#'D
OR fnameout2(0)<4 THEN
Ferror()
ELSEIF fnameout2(2)=': THEN
z=0
EXIT
ELSEIF fnameout2(3)=': THEN
z=1
EXIT
FI
OD
DO
x=fnameout2(j)
j==+1
IF x=$20 THEN
EXIT
ELSEIF x='. THEN
EXIT
ELSEIF j>fnameout2(0) THEN
j==+1
EXIT
ELSEIF j>11+z THEN
Ferror()
EXIT
FI
OD
fnameout2(j-1)='.
fnameout2(j)='R
fnameout2(j+1)='E
fnameout2(j+2)='L
fnameout2(0)=j+2
Print("Generation file = ")
PrintE(fnameout1)
Print("Relocation file = ")
PrintE(fnameout2)
Error=MyError
abrt=0
Close(in1)
Close(in2)
Close(out1)
Close(out2)
Open(in1,fname1,4)
Open(in2,fname2,4)
IF abrt=1 THEN
Close(1)
Close(2)
RETURN
FI
Open(out1,fnameout1,8)
Open(out2,fnameout2,8)
x=GetD(in1) ;throw away two $FF's.
x=GetD(in1)
PutD(out2,$FF)
PutD(out2,$FF)
x=GetD(in1)
PutD(out2,x)
start1=x ;start addr of file1.
x=GetD(in1)
PutD(out2,x)
start1==+(x*256)
x=GetD(in1)
PutD(out2,x)
end1=x
x=GetD(in1)
PutD(out2,x)
end1==+(x*256) ;end addr of file1.
x=GetD(in2) ;throw away two $FF's.
x=GetD(in2)
x=GetD(in2)
start2=x ;start addr of file2.
x=GetD(in2)
start2==+(x*256)
x=GetD(in2)
end2=x
x=GetD(in2)
end2==+(x*256) ;end addr of file2.
offsets=start2-start1
sthigh=start1/256
offsete=end2-end1
PrintDE(out1,"MODULE")
PrintD(out1,";For file ")
PrintDE(out1,fnameout2)
PrintDE(out1,"")
Print("Code starts at ")
PrintD(out1,"CARD start=[")
PrintCE(start1)
PrintCD(out1,start1)
PrintDE(out1,"]")
Print(" and ends at ")
PrintD(out1,"CARD finish=[")
PrintCE(end1)
PrintCD(out1,end1)
PrintDE(out1,"]")
Print("Compile offset was ")
PrintCE(offsets)
IF offsete#offsets THEN
PrintE("Diferrent size files!")
PrintE("ABORTED!")
ELSE
PrintDE(out1,"")
PrintD(out1,"CARD ARRAY otable=[")
wnum=0
hits=0
count=0
WHILE EOF(in1)=0
DO
d1=GetD(in1)
d2=GetD(in2)
IF d1#d2 THEN
IF count<(end1-start1)-5 THEN
hits==+1
IF wnum=0 THEN
PrintD(out1," ")
Print(" ")
ElSE
PrintD(out1," ")
Print(" ")
FI
PrintCD(out1,count)
Print(" ")
PrintC(count)
wnum==+1
IF wnum>4 THEN
PrintDE(out1,"")
PrintE("")
wnum=0
FI
FI
old0=d1
test1=old0*256
test1==+old1
test2=old2*256
test2==+old3
IF test1>=start1 AND test1<=end1 THEN
IF test2=$02E3 OR test2=$02E1 THEN
PrintDE(out1,"]")
PrintE("]")
PrintD(out1,"CARD hits=[")
PrintCD(out1,hits)
PrintDE(out1,"]")
PrintDE(out1,"")
Print("CARD hits=[")
PrintC(hits)
PrintE("]")
PrintE("")
PrintD(out1,"CARD runaddr=[")
Print("CARD runaddr=[")
test1==-start1
PrintCD(out1,test1)
PrintC(test1)
PrintDE(out1,"]")
PrintE("]")
wnum=0
FI
FI
old3=old2
old2=old1
old1=d1
d1==-sthigh
ELSE
old3=old2
old2=old1
old1=d1
FI
PutD(out2,d1)
count==+1
OD
FI
PrintE("")
PrintDE(out1,"")
Close(in1)
Close(in2)
Close(out1)
Close(out2)
PrintE("Finished!")
RETURN
xxxxxxxx